#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2025/10/27 23:57
# @Author  : summer
# @Email   : 610658552@qq.com
# @File    : ser_wechat_template.py
# @Software: PyCharm
# @Desc    :
import json
from rest_framework import serializers
from wechat.models import WechatTemplate


class WechatTemplateSerializer(serializers.ModelSerializer):
    """
    WechatTemplate序列化器：
    1. 敏感字段 wx_app_secret 仅写入，返回时隐藏
    2. 模板标题（name）和微信模板ID（template_id）唯一性校验
    3. 继承BaseSortModel的状态（is_active）、排序号（sort_num）等字段处理
    """
    # # 显式指定template_data为JSONField，确保返回具体JSON结构
    # template_data = serializers.CharField(
    #     help_text="模板变量（JSON格式）",
    #     allow_null=True,  # 允许null（适配模型default=dict）
    #     required=False  # 非必填（模型有default=dict）
    # )
    # 时间字段格式化，仅读取
    create_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
    update_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)

    class Meta:
        model = WechatTemplate
        fields = [
            "id", "name", "wx_app_id", "wx_app_secret", "template_id",
            "template_data", "description", "sort_num", "is_active",
            "create_time", "update_time"
        ]
        read_only_fields = ["id", "create_time", "update_time"]

    def validate_name(self, value):
        """校验模板标题：非空且在有效配置内唯一"""
        value = value.strip()
        if not value:
            raise serializers.ValidationError("模板标题不能为空")

        queryset = WechatTemplate.objects.filter(is_delete=0, pt_flag=0)
        # 新增场景：标题不能重复
        if self.instance is None:
            if queryset.filter(name=value).exists():
                raise serializers.ValidationError(f"新增: 模板标题「{value}」已存在，请更换")
        # 更新场景：排除当前实例后标题不能重复
        else:
            if queryset.exclude(id=self.instance.id).filter(name=value).exists():
                raise serializers.ValidationError(f"编辑: 模板标题「{value}」已存在，请更换")
        return value

    def validate_template_id(self, value):
        """校验微信模板ID：在有效配置内唯一（模型已做格式校验，此处补充唯一性）"""
        value = value.strip()
        queryset = WechatTemplate.objects.filter(is_delete=0, pt_flag=0)

        # 新增场景：模板ID不能重复
        if self.instance is None:
            if queryset.filter(template_id=value).exists():
                raise serializers.ValidationError(f"新增: 微信模板ID「{value}」已存在，不可重复添加")
        # 更新场景：排除当前实例后模板ID不能重复
        else:
            if queryset.exclude(id=self.instance.id).filter(template_id=value).exists():
                raise serializers.ValidationError(f"编辑: 微信模板ID「{value}」已存在，不可重复添加")
        return value

    # 4. 新增template_data的JSON格式校验（完全参考SMSTemplate）
    # def validate_template_data(self, value):
    #     """校验模板变量为JSON格式（允许空字符串，存储标准JSON字符串）"""
    #     if not value:  # 空值直接返回（不修改时留空）
    #         return value
    #     try:
    #         # 关键：将输入的JSON字符串解析为Python对象，再重新转为标准JSON字符串（双引号）
    #         json_obj = json.loads(value)
    #         return json.dumps(json_obj, ensure_ascii=False)  # 确保中文正常，且用双引号
    #     except json.JSONDecodeError as e:
    #         raise serializers.ValidationError(f"模板变量必须为标准JSON格式")

    def create(self, validated_data):
        """创建时处理：若wx_app_secret为空，使用默认值（避免覆盖模型默认）"""
        # 移除空的wx_app_secret（避免传入空字符串覆盖模型default）
        if 'wx_app_secret' in validated_data and not validated_data['wx_app_secret']:
            validated_data.pop('wx_app_secret')
        return super().create(validated_data)

    def update(self, instance, validated_data):
        """更新时处理：仅当wx_app_secret有值时才更新（避免空值覆盖）"""
        # 若wx_app_secret为空，不更新该字段
        if 'wx_app_secret' in validated_data and not validated_data['wx_app_secret']:
            validated_data.pop('wx_app_secret')
        return super().update(instance, validated_data)
